package mr

//
// RPC definitions.
//
// remember to capitalize all names.
//

import (
	"os"
	"strconv"
)

//
// example to show how to declare the arguments
// and reply for an RPC.
//

type ExampleArgs struct {
	X int
}

type ExampleReply struct {
	Y int
}

// Add your RPC definitions here.

// Master或Worker的tops字段类型
const (
	OPS_NONE    = iota // 空消息 - 可用于测试
	OPS_WAIT           // 要求等待 - Master发出
	OPS_STOP           // 要求Worker结束线程 - Master发出
	OPS_M              // Map操作
	OPS_R              // Reduce操作
	OPS_REQUEST        // 请求 - Worker发出
)

// [RPC]AssignTask() req
type AssignRequest struct {
	Tops int // 操作类型
}

// [RPC]AssignTask() resp
type AssignRespone struct {
	Tops      int  // 操作类型
	WorkTask  Task // 工作任务
	ReduceCnt int  // 标记nReduce
}

// [RPC]ReportTaskM/R req
type ReportRequest struct {
	Tops     int  // 操作类型
	WorkTask Task // 工作任务
}

// [RPC]ReportTaskM/R resp
type ReportRespone struct {
	Tops int // 操作类型 - 固定为OPS_WAIT/STOP
}

// Cook up a unique-ish UNIX-domain socket name
// in /var/tmp, for the master.
// Can't use the current directory since
// Athena AFS doesn't support UNIX-domain sockets.
func masterSock() string {
	s := "/var/tmp/824-mr-"
	s += strconv.Itoa(os.Getuid())
	return s
}
